package com.zh.test.CacheManager;

import org.checkerframework.checker.units.qual.C;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @describe spring自带的缓存
 * @author zh
 * @date 2021/9/26 11:40
 * @param
 * @return
 */
@Configuration
public class CacheManager {
    Logger logger = LoggerFactory.getLogger(CacheManager.class);

    @Bean("customerCacheMangerA")  //自定义bean名
    public ConcurrentMapCacheManager creatCacheManagerA(){
        logger.info("spring容器：  开始组装CacheManagerA");
        ConcurrentMapCacheManager manager = new ConcurrentMapCacheManager();
        //todo 声明一个单例管理器
        /**
        manager实际上是个Map<String,Map<String,object>>的结构,在spring容器中添加了一个大容器map,通过map.key来获取缓存属性
        通过注解@cacheable(value {"map名称",,key="#mapkey"}) 从大容器Map中,找key={map名称1,map名称2,map名称3} 的map组,再从里面找到key= mapkey的值
        如果在多个map组中找到了key的value,就直接获取而不是执行被@cacheable修饰的方法,如果没找到,执行方法并把返回值填充到map中
         */
        logger.info("spring容器：  结束组装CacheManagerA");
        return manager;
    }


    @Bean("customerCacheMangerB")  //自定义bean名
    public ConcurrentMapCacheManager creatCacheManagerB(){
        logger.info("spring容器：  开始组装CacheManagerB");
        ConcurrentMapCacheManager manager = new ConcurrentMapCacheManager();
        //todo 声明一个单例管理器
        /**
         * spring容器中允许多个cacheManager存在,方便针对性处理
         * */
        logger.info("spring容器：  结束组装CacheManagerB");
        return manager;
    }

}
